package gpschallenge.mapa;

import java.util.HashMap;

import gpschallenge.mapa.Calle;
import gpschallenge.componentes.utililidades.Posicion;
import gpschallenge.componentes.utililidades.Sentido;
import gpschallenge.direccionamiento.Direccion;

public class Esquina {
	private Posicion unaPosicion;
	private HashMap<Sentido, Calle> callesAdyacentes;

	public Esquina(Posicion unaPos) {
		callesAdyacentes = new HashMap<Sentido, Calle>();
		unaPosicion = unaPos;
		
		// Calle de la derecha
		Sentido unSentido = Sentido.DERECHA;
		Posicion unaPosicionAuxiliar = new Posicion(unaPosicion.getX(),unaPosicion.getY() + 1);
		callesAdyacentes.put(unSentido, new Calle(unaPosicionAuxiliar));
		
		// Calle de la izquierda
		unaPosicionAuxiliar = new Posicion(unaPosicion.getX(),unaPosicion.getY() - 1);
		unSentido = Sentido.IZQUIERDA;
		callesAdyacentes.put(unSentido, new Calle(unaPosicionAuxiliar));
		
		// Calle de Abajo
		unaPosicionAuxiliar = new Posicion(unaPosicion.getX() + 1,unaPosicion.getY());
		unSentido = Sentido.ABAJO;
		callesAdyacentes.put(unSentido, new Calle(unaPosicionAuxiliar));
		
		// Calle de Arriba
		unaPosicionAuxiliar = new Posicion(unaPosicion.getX() - 1,unaPosicion.getY());
		unSentido = Sentido.ARRIBA;
		callesAdyacentes.put(unSentido, new Calle(unaPosicionAuxiliar));
	}

	public int getCantidadDeCalles() {
		return callesAdyacentes.size();
	}

	public Posicion getPosicion() {
		return unaPosicion;
	}

	public void setCalle(Sentido unSentido, Calle nuevaCalle) {
		callesAdyacentes.put(unSentido, nuevaCalle);
	}

	public Calle getCalleEnDireccion(Direccion unaDireccion) {
		int x = unaDireccion.obtenerPosicion().getX();
		int y = unaDireccion.obtenerPosicion().getY();
		if (x == 0) {
			switch (y) {
			case 1:
				return getCalleEnSentido(Sentido.DERECHA);
			case -1:
				return getCalleEnSentido(Sentido.IZQUIERDA);
			}
		} else {
			switch (x) {
			case 1:
				return getCalleEnSentido(Sentido.ABAJO);
			case -1:
				return getCalleEnSentido(Sentido.ARRIBA);
			}
		}
		return null;
	}

	public HashMap<Sentido, Calle> getCallesAdyascentes() {
		return callesAdyacentes;
	}

	public Calle getCalleEnSentido(Sentido unSentido) {
		return (Calle) callesAdyacentes.get(unSentido);
	}

}
